;##################################
;命令：
;nasm -f elf64 day7_0vector_1shuffle_1extend.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;Value in arr[0] is 3.333300.
;Value in arr[1] is 1.111100.
;Value in arr[2] is 2.222200.
;Value in arr[3] is 4.444400.
;##################################
extern printf

section .data
	msg: db `Value in arr[%d] is %f.\n`, 0
	arr: dd 1.1111, 2.2222, 3.3333, 4.4444

section .text
	global main

main:
	push rbp
	mov rbp, rsp

;#######################################################################
	vmovups xmm0, [arr]
	vmovups xmm1, [arr]
	;SHUFPS XMM0, XMM1, 9Ch
	;shufps 目的寄存器, 源寄存器, 排序二进制
	;排序二进制构建方法：
	;一个寄存器从左到右分别为：00, 01, 10, 11
	;目的寄存器a, 目的寄存器b, 源寄存器c, 源寄存器d
	;逆序，写成dcba
	;例如，我们把arr0作为目的寄存器
	;得到：3.3333, 1.1111, 2.2222, 4.4444
	;目的寄存器10, 目的寄存器00, 源寄存器01, 源寄存器11
	;逆序写出来：源寄存器11, 源寄存器01, 目的寄存器00, 目的寄存器10
	;去掉多余内容得到：11010010
	vshufps xmm0, xmm1, 11010010b
	vmovups [arr], xmm0
;#######################################################################

	;打印
	mov ebx, 0
	jmp compare

execute:
	mov rdi, msg
	movsxd rsi, ebx
	cvtss2sd xmm0, dword [arr + 4 * ebx]
	movq rdx, xmm0
	call printf

	inc ebx

compare:
	cmp ebx, 4
	jl execute

	mov eax, 0
	leave
	ret
